#ifndef TASKQUEUE_H
#define TASKQUEUE_H

#include <QQueue>
#include <QMutex>
#include <QWaitCondition>


// 定义函数指针
typedef void (*callback)(void* arg);
// 任务类
struct Task
{
    Task()
    {
        function = NULL;
        arg = NULL;
    }
    // 公共成员
    // 函数指针
    callback function;	// 保存任务的地址
    // 函指针的参数
    void* arg;			// 保存任务的参数
};


// 任务队列类 -> 单例模式(饿汉)
// 这个任务队列可能是被多个线程访问的
// 线程安全: 是在访问单例对象的没有线程安全问题
class TaskQueue
{
public:
    // 得到单例对象
    static TaskQueue* getInstance();

    // 属于唯一的单例对象的成员函数
    // 添加任务到任务队列 --> 生产者调用的函数
    void addTask(Task &t);
    void addTask(callback func, void* arg);

    // 从任务队列中拿出一个任务(队头)
    // 消费者调用的函数
    Task takeTask();

    // 当前任务队列中任务个数
    int taskNumber();

private:
    TaskQueue();
    TaskQueue(const TaskQueue&){}

    // 单例的静态对象
    static TaskQueue m_queue;

    // 存储任务的队列
    // 在多线程访问这个队列对象的时候, 需要加锁
    QQueue<Task> m_taskQ;
    // 互斥锁对象
    QMutex m_mutex;
    // 添加条件变量, 阻塞消费者线程
    QWaitCondition m_cond;
};

#endif // TASKQUEUE_H
